package cn.acyou.leo.framework.constant;

import cn.acyou.leo.framework.model.ErrorEnum;

/**
 * 统一错误码/错误信息
 * 6位数字code
 * 系统模块：10XXXX
 *
 * 用户模块：20XXXX
 * 订单模块：21XXXX
 * 商品模块：22XXXX
 *
 *
 * @author youfang
 * @version [1.0.0, 2020/7/9]
 **/
public enum CommonErrorEnum implements ErrorEnum {
    /*———1xx（临时响应）—————————————————————————————*/
    HTTP_100(100,"继续"),//	请求者应当继续提出请求。 服务器返回此代码表示已收到请求的第一部分，正在等待其余部分。
    HTTP_101(101,"切换协议"),//	请求者已要求服务器切换协议，服务器已确认并准备切换。
    HTTP_102(102,"继续执行"),//	由WebDAV（RFC 2518）扩展的状态码，代表处理将被继续执行。
    HTTP_103(103,"早期提醒"),//	利用服务器思考时间来传递内容，当浏览器向服务器发出请求时等待回应时，由边缘网络线发送页面载入提示给浏览器。
    /*———2xx （成功）—————————————————————————————*/
    HTTP_200(200,"成功"),//	服务器已成功处理了请求。 通常，这表示服务器提供了请求的网页。
    HTTP_201(201,"已创建"),//	请求成功并且服务器创建了新的资源。
    HTTP_202(202,"已接受"),//	服务器已接受请求，但尚未处理。
    HTTP_203(203,"非授权信息"),//	服务器已成功处理了请求，但返回的信息可能来自另一来源。
    HTTP_204(204,"无内容"),//	服务器成功处理了请求，但没有返回任何内容。
    HTTP_205(205,"重置内容"),//	服务器成功处理了请求，但没有返回任何内容。
    HTTP_206(206,"部分内容"),//	服务器成功处理了部分 GET 请求。
    HTTP_207(207,"多种状态"),//	由WebDAV(RFC 2518)扩展的状态码，代表之后的消息体将是一个XML消息，并且可能依照之前子请求数量的不同，包含一系列独立的响应代码。
    /*———3xx （重定向）—————————————————————————————*/
    HTTP_300(300,"多种选择"),//	针对请求，服务器可执行多种操作。 服务器可根据请求者 (user agent) 选择一项操作，或提供操作列表供请求者选择。
    HTTP_301(301,"永久移动"),//	请求的网页已永久移动到新位置。 服务器返回此响应（对 GET 或 HEAD 请求的响应）时，会自动将请求者转到新位置。
    HTTP_302(302,"临时移动"),//	服务器目前从不同位置的网页响应请求，但请求者应继续使用原有位置来进行以后的请求。
    HTTP_303(303,"查看其他位置"),//	请求者应当对不同的位置使用单独的 GET 请求来检索响应时，服务器返回此代码。
    HTTP_304(304,"未修改"),//	自从上次请求后，请求的网页未修改过。 服务器返回此响应时，不会返回网页内容。
    HTTP_305(305,"使用代理"),//	请求者只能使用代理访问请求的网页。 如果服务器返回此响应，还表示请求者应使用代理。
    HTTP_306(306,"--"),//	已经不再被使用。
    HTTP_307(307,"临时重定向"),//	服务器目前从不同位置的网页响应请求，但请求者应继续使用原有位置来进行以后的请求。
    /*———4xx（请求错误）—————————————————————————————*/
    HTTP_400(400, "错误请求"),//	服务器不理解请求的语法。
    HTTP_401(401, "未授权"),//	请求要求身份验证。 对于需要登录的网页，服务器可能返回此响应。
    HTTP_403(403, "禁止"),//	服务器拒绝请求。
    HTTP_404(404, "未找到"),//	服务器找不到请求的网页。
    HTTP_405(405, "方法禁用"),//	禁用请求中指定的方法。
    HTTP_406(406, "不接受"),//	无法使用请求的内容特性响应请求的网页。
    HTTP_407(407, "需要代理授权"),//	此状态代码与 401（未授权）类似，但指定请求者应当授权使用代理。
    HTTP_408(408, "请求超时"),//	服务器等候请求时发生超时。
    HTTP_409(409, "冲突"),//	服务器在完成请求时发生冲突。 服务器必须在响应中包含有关冲突的信息。
    HTTP_410(410, "已删除"),//	如果请求的资源已永久删除，服务器就会返回此响应。
    HTTP_411(411, "需要有效长度"),//	服务器不接受不含有效内容长度标头字段的请求。
    HTTP_412(412, "未满足前提条件"),//	服务器未满足请求者在请求中设置的其中一个前提条件。
    HTTP_413(413, "请求实体过大"),//	服务器无法处理请求，因为请求实体过大，超出服务器的处理能力。
    HTTP_414(414, "请求的 URI 过长"),//	请求的 URI（通常为网址）过长，服务器无法处理。
    HTTP_415(415, "不支持的媒体类型"),//	请求的格式不受请求页面的支持。
    HTTP_416(416, "请求范围不符合要求"),//	如果页面无法提供请求的范围，则服务器会返回此状态代码。
    HTTP_417(417, "未满足期望值"),//	服务器未满足"期望"请求标头字段的要求。
    HTTP_421(421, "连接过多"),//	从当前客户端所在的iP地址到服务器的连接数超过了服务器许可的最大范围。通常，这里的iP地址指的是从服务器上看到的客户端地址（比如用户的网关或者代理服务器地址）。在这种情况下，连接数的计算可能涉及到不止一个终端用户。
    HTTP_422(422, "错误实体"),//	请求格式正确，但是由于含有语义错误，无法响应。（RFC 4918 WebDAV）
    HTTP_423(423, "锁定"),//	当前资源被锁定。（RFC 4918 WebDAV）
    HTTP_424(424, "错误接洽关系"),//	由于之前的某个请求发生的错误，导致当前请求失败，例如 PROPPATCH。（RFC 4918 WebDAV）
    HTTP_425(425, "无序集合"),//	在WebDav Advanced Collections 草案中定义，但是未出现在《WebDAV 顺序集协议》（RFC 3658）中。
    HTTP_426(426, "进级请求"),//	客户端应当切换到TLS/1.0。（RFC 2817）
    HTTP_428(428, "要求先决条件"),//	先决条件是客户端发送 HTTP 请求时，如果想要请求能成功必须满足一些预设的条件。
    HTTP_429(429, "太多请求"),//	当你需要限制客户端请求某个服务数量时，该状态码就很有用，也就是请求速度限制。
    HTTP_431(431, "请求头字段太大"),//	某些情况下，客户端发送 HTTP 请求头会变得很大，那么服务器可发送 431 Request Header Fields Too Large 来指明该问题。
    HTTP_451(451, "因法律原因而被官方审查"),//	由于法律原因产生的后果而被官方拒绝访问
    /*———5xx（服务器错误）—————————————————————————————*/
    HTTP_500(500,"服务器内部错误"),//	服务器遇到错误，无法完成请求。
    HTTP_501(501,"尚未实施"),//	服务器不具备完成请求的功能。 例如，服务器无法识别请求方法时可能会返回此代码。
    HTTP_502(502,"错误网关"),//	服务器作为网关或代理，从上游服务器收到无效响应。
    HTTP_503(503,"服务不可用"),//	服务器目前无法使用（由于超载或停机维护）。 通常，这只是暂时状态。
    HTTP_504(504,"网关超时"),//	服务器作为网关或代理，但是没有及时从上游服务器收到请求。
    HTTP_505(505,"HTTP 版本不受支持"),//	服务器不支持请求中所用的 HTTP 协议版本。
    HTTP_506(506,"变体协商"),//	由《透明内容协商协议》（RFC 2295）扩展，代表服务器存在内部配置错误：被请求的协商变元资源被配置为在透明内容协商中使用自己，因此在一个协商处理中不是一个合适的重点。
    HTTP_507(507,"存储不足"),//	服务器无法存储完成请求所必须的内容。这个状况被认为是临时的。WebDAV (RFC 4918)
    HTTP_509(509,"超过带宽限制"),//	服务器达到带宽限制。这不是一个官方的状态码，但是仍被广泛使用。
    HTTP_510(510,"不可拓展"),//	获取资源所需要的策略并没有满足。（RFC 2774）
    HTTP_511(511,"要求网络认证"),//	如果你频繁使用笔记本和智能手机，你可能会注意到大量的公用 WIFI 服务要求你必须接受一些协议或者必须登录后才能使用。
    /*———6xx—————————————————————————————*/
    HTTP_600(600,"没有返回响应头部"),//	源站没有返回响应头部，只返回实体内容

    /**
     * 公共/系统
     */
    E_PARAM_ERROR(101001, "请求参数错误，请检查！"),
    E_NOT_FOUNT(101002, "请求接口不存在，请检查！"),
    E_INVALID_SORT_PARAMETER(101003, "非法的排序参数，请检查！"),
    E_MAX_UPLOAD_SIZE_EXCEEDED(101004, "文件超过上传限制！"),
    ACCESS_LIMIT(101005, "重复请求，请稍后再试！"),
    REPETITIVE_OPERATION(101015, "请勿重复操作！"),
    E_PARAM_VALID_ERROR(101006, "请求参数校验错误，请检查！"),
    E_PARAM_CONVERT_ERROR(101016, "请求参数格式转换错误，请检查！"),
    CONCURRENT_ERROR(101007, "正在处理中，请稍后..."),
    BAD_SQL_ERROR(101008, "SQL语法错误，请检查！"),
    NO_WAIT_RESULT_ERROR(101009, "未查询到结果！"),
    /**
     * 登录
     */
    E_UNAUTHENTICATED(102001, "未登录，请先登录！"),
    E_INSUFFICIENT_PERMISSIONS(102100, "权限不足，请联系管理员！"),
    E_LOGIN_TIMEOUT(102002, "登录已过期，请重新登录！"),
    E_LOGIN_AT_OTHER_WHERE(102003, "账号在别处登录，已被迫下线！"),
    E_MINI_PROGRAM_FAIL(102004, "微信登录失败，请获取手机号登录！"),
    E_CODE_BEEN_USE(102005, "小程序登录Code已经被使用，请退出后重新登录。"),
    /**
     * 权限
     */
    E_UNAUTHORIZED(103001, "对不起，您没有访问权限，如需要请联系管理员！"),
    E_DATA_PERMISSION_DENIED(103002, "您没有查看数据的权限，请联系管理员！"),
    /**
     * 二次确认
     */
    E_NEED_SURE(104001, "需要确认操作！"),
    /**
     * 要刷新页面
     */
    E_DO_REFRESH(104002, "请刷新页面！"),
    /**
     * 乐观锁
     */
    E_OPTMISTIC_MODIFIED(105001, "页面内容过期了，请刷新页面后再继续操作！"),
    E_OPTMISTIC_REMOVE(105002, "页面数据已经被删除，请稍后刷新再试！"),

    ;

    // 成员变量
    private final int code;

    private final String message;

    CommonErrorEnum(int code, String message) {
        this.code = code;
        this.message = message;
    }

    /**
     * 得到提示信息
     *
     * @param code 代码
     * @return 提示信息
     */
    public static String getMessage(int code) {
        for (CommonErrorEnum c : CommonErrorEnum.values()) {
            if (c.getCode() == code) {
                return c.message;
            }
        }
        return null;
    }

    public int getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }
}
